#include "syscall.h"
#include "../proc/proc.h"
#include "../mm/vm.h"
#include "../../include/memlayout.h"

// 系统调用：fork - 创建新进程
uint64
sys_fork(void)
{
  return fork();
}

// 系统调用：exit - 退出当前进程
uint64
sys_exit(void)
{
  int n;
  argint(0, &n);
  exit(n);
  return 0;  // not reached
}

// 系统调用：wait - 等待子进程退出
uint64
sys_wait(void)
{
  uint64 p;
  argaddr(0, &p);
  return wait(p);
}

// 系统调用：getpid - 获取当前进程ID
uint64
sys_getpid(void)
{
  printf("sys_getpid: returning pid=%d\n", myproc()->pid);
  return myproc()->pid;
}

// 系统调用：sbrk - 增加或减少进程的内存空间
uint64
sys_sbrk(void)
{
  int addr;
  int n;
  struct proc *p = myproc();

  argint(0, &n);
  addr = p->sz;
  if(n > 0){
    // 懒分配：只增加sz，不实际分配内存
    p->sz += n;
  } else if(n < 0){
    // 减少内存：需要释放页
    if((uint64)(addr + n) < addr)
      return -1;
    p->sz = uvmdealloc(p->pagetable, addr, addr + n);
  }
  return addr;
}

// 系统调用：kill - 杀死指定进程
uint64
sys_kill(void)
{
  int pid;
  argint(0, &pid);
  // 简化实现：查找进程并设置killed标志
  struct proc *p;
  for(p = proc; p < &proc[NPROC]; p++){
    acquire(&p->lock);
    if(p->pid == pid){
      setkilled(p);
      release(&p->lock);
      return 0;
    }
    release(&p->lock);
  }
  return -1;
}

// 系统调用：pause - 暂停当前进程（简化实现）
uint64
sys_pause(void)
{
  // 简化实现：什么都不做
  return 0;
}

// 系统调用：uptime - 获取系统运行时间（tick数）
uint64
sys_uptime(void)
{
  extern volatile uint64 ticks;
  return ticks;
}


